<?php

require_once dirname(__FILE__).'/../lib/ins_abonnementGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/ins_abonnementGeneratorHelper.class.php';

/**
 * ins_abonnement actions.
 *
 * @package    tfe
 * @subpackage ins_abonnement
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ins_abonnementActions extends autoIns_abonnementActions {

    // surcharge pour permettre d'intégrer le formulaire de choix des jours sous forme de "dialog"
    // au formulaire de modification (pas d'ajout !)
    public function executeEdit(sfWebRequest $request) {
        $this->ins_abonnement = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->ins_abonnement);

        $this->dates_form = new RepresentationsInsAbonnement($this->form->getObject());
    }

    // idem
    public function executeUpdate(sfWebRequest $request) {
        $this->ins_abonnement = $this->getRoute()->getObject();
        $this->form = $this->configuration->getForm($this->ins_abonnement);

        $this->processForm($request, $this->form);

        $this->dates_form = new RepresentationsInsAbonnement($this->getRoute()->getObject());

        $this->setTemplate('edit');
    }


    public function executeNew(sfWebRequest $request) {
        $id = $request->getParameter('id');
        if($id) {
            $ins = new InsAbonnement();
            $ins->setIdContact($request->getParameter('id'));
            $this->form = new InsAbonnementForm($ins);
        }else {
            $this->form = $this->configuration->getForm();
        }
        $this->ins_abonnement = $this->form->getObject();
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

        // pas de check si update de l'inscription, mais modification des réservations si à blanc
        if(!$form->getObject()->isNew()) {
            if ($form->isValid()) {
                $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';

                $ins_abonnement = $form->save();

                // modif des réservations si aucune encore faite
                $setReservations = false;
                $liste_spectacles = $ins_abonnement->getAbonnement()->getSpectacles();
                foreach($liste_spectacles as $spectacle) {
                    // d'abord, trouver la liste des évènements liés au spectacle
                    $evenements = Doctrine_Query::create()
                            ->from('RepresentationSpectacle')
                            ->where('id_spectacle = ?', $spectacle->getId())
                            ->execute();
                    // mettre les id dans un tableau
                    $ids_evenements = array();
                    $i=0;
                    foreach($evenements as $evenement) {
                        $ids_evenements[$i] = $evenement->getId();
                        $i++;
                    }
                    $reservations = Doctrine_Query::create()
                            ->from('Reservation')
                            ->whereIn('id_evenement', $ids_evenements)
                            ->andWhere('id_contact = ?', $ins_abonnement->getIdContact())
                            ->execute();
                    if(count($reservations) == 0) {
                        $setReservations = true;
                    }
                    $reservations = Doctrine_Query::create()
                            ->from('Reservation')
                            ->whereIn('id_evenement', $ids_evenements)
                            ->andWhere('id_groupe = ?', $ins_abonnement->getIdGroupe())
                            ->execute();
                    if(count($reservations) == 0) {
                        $setReservations = true;
                    }
                }

                if($setReservations && $ins_abonnement->getValidee()) {
                    $form->enregistrerReservations($ins_abonnement);
                }



                $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_abonnement)));

                if ($request->hasParameter('_save_and_add')) {
                    $this->getUser()->setFlash('notice', $notice.' You can add another one below.');

                    $this->redirect('@ins_abonnement_new');
                }
                else {
                    $this->getUser()->setFlash('notice', $notice);

                    $this->redirect(array('sf_route' => 'ins_abonnement_edit', 'sf_subject' => $ins_abonnement));
                }
            }
            else {
                $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
            }
        }else {

            // éviter les doublons
            $existant = null;

            if($form->getValue('id_groupe') == null) {
                $existant = Doctrine_Query::create()
                        ->from('InsAbonnement')
                        ->where('id_contact = ?', $form->getValue('id_contact'))
                        ->andWhere('id_abonnement = ?', $form->getValue('id_abonnement'))
                        ->andWhere('deleted_at is null')
                        ->andWhere('annulee = ?', false)
                        ->execute();
            }else {
                $existant = Doctrine_Query::create()
                        ->from('InsAbonnement')
                        ->where('id_groupe = ?', $form->getValue('id_groupe'))
                        ->andWhere('id_abonnement = ?', $form->getValue('id_abonnement'))
                        ->andWhere('deleted_at is null')
                        ->andWhere('annulee = ?', false)
                        ->execute();
            }

            // si il y a une inscription existante, on le signale
            if(count($existant) != 0) {
                $this->getUser()->setFlash('error','Il y a déjà une inscription à ce nom cette année !',false);
            }else {
                if ($form->isValid()) {
                    $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';

                    $ins_abonnement = $form->save();

                    $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_abonnement)));

                    if ($request->hasParameter('_save_and_add')) {
                        $this->getUser()->setFlash('notice', $notice.' You can add another one below.');

                        $this->redirect('@ins_abonnement_new');
                    }
                    else {
                        $this->getUser()->setFlash('notice', $notice);

                        $this->redirect(array('sf_route' => 'ins_abonnement_edit', 'sf_subject' => $ins_abonnement));
                    }
                }
                else {
                    $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
                }
            }
        }
    }

    public function executeCreerReservations(sfWebRequest $request) {
        $inscription = Doctrine_Core::getTable('InsAbonnement')->find($request->getParameter('id_inscription'));
        if($inscription->getValidee() == true && $inscription->getAnnulee() == false) {
            $this->creerReservations($request, $inscription);
            $this->getUser()->setFlash('notice','Les réservations correspondantes sont enregistrées');
        }else {
            $this->getUser()->setFlash('notice','Les réservations correspondantes seront enregistrées quand l\'inscription sera validée');
        }

        $this->redirect('ins_abonnement/edit?id='. $inscription->getId());
    }

    public function creerReservations(sfWebRequest $request = null, $inscription = null) {
        $form = new RepresentationsInsAbonnement($inscription);

        // supprimer les réservations déjà faites
        $liste_spectacles = $inscription->getAbonnement()->getSpectacles();
        foreach($liste_spectacles as $spectacle) {


            // supprimer une réservation existante (pour groupe ou contact)

            // d'abord, trouver la liste des évènements liés au spectacle
            $evenements = Doctrine_Query::create()
                    ->from('RepresentationSpectacle')
                    ->where('id_spectacle = ?', $spectacle->getId())
                    ->execute();
            // mettre les id dans un tableau
            $ids_evenements = array();
            $i=0;
            foreach($evenements as $evenement) {
                $ids_evenements[$i] = $evenement->getId();
                $i++;
            }
            Doctrine_Query::create()->delete()
                    ->from('Reservation')
                    ->whereIn('id_evenement', $ids_evenements)
                    ->andWhere('id_contact = ?', $request->getParameter('id_contact'))
                    ->execute();
            Doctrine_Query::create()->delete()
                    ->from('Reservation')
                    ->whereIn('id_evenement = ?', $ids_evenements)
                    ->andWhere('id_groupe = ?', $request->getParameter('id_groupe'));
        }

        // passer en revue les représentations sélectionnées
        for($idx=0; $idx < $form->getNbSpectacles(); $idx++) {
            $id_evenement = $request->getParameter('spectacle_'. $idx);

            if(Doctrine_Core::getTable('Evenement')->find($id_evenement)) {
                // créer une nouvelle réservation à la nouvelle date
                $reservation = new Reservation();
                if($request->getParameter('id_contact')) {
                    $reservation->setIdContact($request->getParameter('id_contact'));
                    $reservation->setNbPers(1);
                }else {
                    $reservation->setIdContact($request->getParameter('id_groupe'));
                    $nb_membres = count(Doctrine_core::getTable('Groupe')->find($request->getParameter('id_groupe')->getMembresGroupe()));
                    $reservation->setNbPers($nb_membres);
                }
                $reservation->setIdEvenement($id_evenement);
                $reservation->setCommentaire('Réservation issue d\'un abonnement');
                $reservation->setPrix(0);
                $reservation->setReduction(0);
                $reservation->setModeDePaiement($inscription->getModeDePaiement());
                $reservation->setDateDePaiement($inscription->getDateDePaiement());
                $reservation->setCodeDePaiement($inscription->getCodeDePaiement());
                $reservation->setValidee($inscription->getValidee());
                $reservation->setAnnulee($inscription->getAnnulee());
                $reservation->setExpiree($inscription->getExpiree());
                $reservation->setAEnvoyer($inscription->getAEnvoyer());
                $reservation->setEnvoyee($inscription->getEnvoyee());
                $reservation->setARembourser($inscription->getARembourser());
                $reservation->setRemboursee($inscription->getRemboursee());


                $reservation->save();
            }
        }

    }


}
